package com.wuyou.threadlocal;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;

/**
 * SoftReferenceDemo
 *
 * @Date 2025/9/23 14:46
 * @Author 无忧
 */
public class SoftReferenceDemo {

    public static void main(String[] args) throws InterruptedException {

        // 弱引用举例
//        Object obj = new Object();
//        SoftReference softRef = new SoftReference<Object>(obj);//删除强引用
//        obj = null;

        // 调用gc 对象依然存在
//        System.gc();
//        System.out.println("gc之后的值：" + softRef.get());

        ReferenceQueue<Object> queue = new ReferenceQueue<>();
        Object obj = new Object();
        SoftReference softRef = new SoftReference<Object>(obj, queue);//删除强引用
        obj = null;//调用gc
        System.gc();
        System.out.println("gc之后的值: " + softRef.get()); // 对象依然存在
//申请较大内存使内存空间使用率达到阈值，强迫gc
        byte[] bytes = new byte[100 * 1024 * 1024];
        //如果obj被回收，则软引用会进入引用队列
        Reference<?> reference = queue.remove(10000);
        if (reference != null) {
            System.out.println("对象已被回收: " + reference.get());  // 对象为null
        } else {
            System.out.println("超时，对象可能尚未被回收");
        }
        System.out.println(softRef.get());
    }
}
